package com.unionServer.common;

import lombok.extern.slf4j.Slf4j;

import java.io.UnsupportedEncodingException;
import java.util.HashMap;

/**
 * @description:
 * @author: wangxinal
 * @time: 2022/1/19 18:14
 */
@Slf4j
public class ICCDataConvertor {

    public ICCDataConvertor() {
    }

    public  String hex2bin(String str) {
        String s= Integer.toBinaryString(Integer.parseInt(str,16));
        return s;
    }
    public  int bin2dec(String str) {
        int num= Integer.parseInt(str,2);
        return num;
    }

    public String padleft (String oristr,int len,char alexin) {
        int strlen = oristr.length();
        String str = "";
        if(strlen < len) {
            for (int i = 0;i<len-strlen;i++){
                str = str+alexin;
            }
        }
        str = str+oristr;
        return str;
    }

    public void getFromBcd(String ICC_DATA,String motherName, HashMap<String,Object> map) {
        String v_hex = "";
        String v_bin = "";
        String v_tag_hex = "";
        String v_length_hex = "";
        String v_length_bin = "";
        String v_value_hex = "";
        int v_length_dec = 0;


            log.debug("ICC_DATA={}.", ICC_DATA);

            while (ICC_DATA.length() > 0) {
                // 获取标签第一个字节
                v_hex = ICC_DATA.substring(0, 2);

                // 十六进制转换二进制
                v_bin = hex2bin(v_hex);

                // 判断标签是由一个字节还是两个字节组成，获取标签TAG
                if (v_bin.substring(v_bin.length() - 5, v_bin.length()).equals(
                        "11111")) {
                    // 标签占两个字节
                    v_tag_hex = ICC_DATA.substring(0, 4);
                } else {
                    // 标签占一个字节
                    v_tag_hex = ICC_DATA.substring(0, 2);
                }

                // 从原始数据中清除掉标签（TAG）
                ICC_DATA = ICC_DATA.substring(v_tag_hex.length());
                // 获取数据长度LENGTH
                v_length_hex = ICC_DATA.substring(0, 2);
                // 转换为二进制
                v_length_bin = padleft(hex2bin(v_length_hex), 8, '0');

                // 判断LENGTH占多少个字节
                if (v_length_bin.substring(0, 1).equals("0")) {
                    // LENGTH占1个字节，从LENGTH中去除第一位
                    v_length_bin = v_length_bin.substring(0, 8);
                    // 转换为十进制
                    v_length_dec = bin2dec(v_length_bin);
                    // 从字符串中清除掉长度LENGTH所占字节数
                    ICC_DATA = ICC_DATA.substring(2);
                } else {
                    // 从LENGTH中去除第一位
                    v_length_bin = v_length_bin.substring(1, 8);
                    //LENGTH补足八位长
                    v_length_bin = "0" + v_length_bin;
                    // 转换为十进制
                    v_length_dec = bin2dec(v_length_bin);
                    // 从原始字符串中清除掉长度LENGTH本身1个字节数
                    ICC_DATA = ICC_DATA.substring(2);
                    // 获取value值的总字节数
                    v_length_bin = ICC_DATA.substring(0, v_length_dec);
                    // 从原始字符串中清除掉长度LENGTH剩余所占字节数
                    ICC_DATA = ICC_DATA.substring(0 + v_length_dec);
                    // value值的总字节数转换为十进制
                    v_length_dec = bin2dec(v_length_bin);
                }
                // 获取数据VALUE
                v_value_hex = ICC_DATA.substring(0, v_length_dec * 2);
                if (v_value_hex.length() < ICC_DATA.length()) {
                    // 从原始字符串中清除掉数据(VALUE)
                    ICC_DATA = ICC_DATA.substring(0 + v_length_dec * 2);
                } else {
                    ICC_DATA = "";
                }
                log.info("TAG : " + v_tag_hex + " VALUE : " + v_value_hex);
                map.put(motherName + "_" + v_tag_hex,v_value_hex);

            }

    }
}
